package comunicaciones
import traits.TDescuentoPlanAmigos
import traits.TDescuentoHablateTodo
import planes.Plan
import planes.PrepagoLocal
import planes.PrepagoInternacional
import java.util.Date

class LlamadaLocal(num :Int, segundos : Int) extends Llamada{
	var numDest = num
	var duracion = segundos
	

	
	/**
	 *  Aplica a una llamada local el descuento del plan numeros amigos
	 */
	override def paraNumerosAmigos(nums :List[Int]) : Comunicacion =  {
	    var call = new LlamadaLocal(this.numDest,this.duracion) with TDescuentoPlanAmigos{
	      override def numerosEnPlan = nums
	    }
	    call.fecha = this.fecha
	    call
	}
	
	/**
	 *  Aplica a una llamada local el descuento del plan hablate todo
	 */
	override def paraHablateTodo() : Comunicacion = {
	    var call = new LlamadaLocal(this.numDest,this.duracion) with TDescuentoHablateTodo
	    call.fecha = this.fecha
	    call
	}
	
	/**
	 *  Aplica a una llamada local el descuento del plan ciudades amigas
	 */
	override def paraPrepagoLocal(plan : PrepagoLocal) : Comunicacion = {
	   this.verificarMes(plan)
	   this.aplicarDescuento(plan)
	   this
	}
	
	// Auxiliar de paraPrepagoLocal(plan : PrepagoLocal) : Comunicacion
	def verificarMes(plan :PrepagoLocal) : Unit ={
	   if(this.fecha.getMonth() != plan.mes){ // Si la llamada es de otro mes al del plan
          plan.minsRestantes = plan.mins      // Los 60 minutos se vuelvena  recargar
          plan.mes = this.getMes()      // El mes se actualiza
        }	
	}
	
	// Auxiliar de paraPrepagoLocal(plan : PrepagoLocal) : Comunicacion
	def aplicarDescuento(plan : PrepagoLocal){
	  println("Hay minutos: "+plan.minsRestantes )
	  if(plan.minsRestantes > 0){          // Si tengo 0 minutos del Plan, no descuento y la llamada se cobra 
	        println("Duracion es: "+this.duracion)
        	    							  //   toda, si tengo minutos, descuento
        	if(plan.minsRestantes >= this.getDuracion()){  //
        		plan.setMinsRestantes(plan.minsRestantes - this.getDuracion()) 
        		this.setDuracion(0)
        		println("Minutos restantes: "+plan.minsRestantes)
        	}else{
        		var segsUsados = this.getDuracion()
        		this.setDuracion(this.getDuracion() - plan.minsRestantes)
        		plan.setMinsRestantes(segsUsados - plan.minsRestantes)  
        		println("Minutos restantes: "+plan.minsRestantes)
        	}
        }
	}
	
	/**
	 *  Calcula el precio de una llamada
	 */
	def calcularPrecio :Double ={
	    var total = 0.0
	    if(this.duracion > 60){
	      total = 0.60 + calcularPrecioEnSegs(this.duracion - 60)
	      total
	    }
	    else{if(this.duracion.equals(0)){
	    		0.0
	        }else{
	          0.60
	          }
	    }
	}
	
	// Auxiliar de calcularPrecio :Double
	def calcularPrecioEnSegs(duracion : Int): Double ={
	   if(duracion < 10){
	     0.0
	   }
	   else{
	     0.10 + calcularPrecioEnSegs(duracion - 10)
	   }
	}

}